package com.liujun.io.nio.mysql.bean.protocol;

import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;

import com.liujun.io.nio.mysql.protocol.comm.MySQLMessage;
import com.liujun.io.nio.mysql.protocol.inf.DataParseInf;

/**
 * 进行第一次的握手协议包
* 源文件名：HandshakePackage.java
* 文件版本：1.0.0
* 创建作者：liujun
* 创建日期：2016年12月8日
* 修改作者：liujun
* 修改日期：2016年12月8日
* 文件描述：TODO
* 版权所有：Copyright 2016 zjhz, Inc. All Rights Reserved.
*/
public class HandshakeBean extends PackageHeader implements DataParseInf<HandshakeBean> {

    /**
     * 服务协议版本号：该值由 PROTOCOL_VERSION 宏定义决定（参考MySQL源代码/include/mysql_version.h头文件定义），抓包显示协议版本号为10
    * @字段说明 protocolVersion
    */
    protected byte protocolVersion;

    /**
     * 服务版本信息：该值为字符串，由 MYSQL_SERVER_VERSION 宏定义决定（参考MySQL源代码/include/mysql_version.h头文件定义），抓包显示mysql服务器版本为5.6.22
    * @字段说明 serverVersion
    */
    protected byte[] serverVersion;

    /**
     * 服务器线程ID：服务器为当前连接所创建的线程ID。因为客户端创连接到服务器，服务器分配给单独的进程，抓包显示进程号为5，可通过登陆键入show process list验证
    * @字段说明 serverThreadId
    */
    protected long serverThreadId;

    /**
     * 挑战随机数：8位,MySQL数据库用户认证采用的是挑战/应答的方式，服务器生成该挑战数并发送给客户端，由客户端进行处理并返回相应结果，然后服务器检查是否与预期的结果相同，从而完成用户认证的过程。
    * @字段说明 challengeRandom
    */
    protected byte[] challengeRandom;

    /**
     * 服务器权能标志：用于与客户端协商通讯方式，各标志位含义如下（参考MySQL源代码/include/mysql_com.h中的宏定义）：
    * @字段说明 serverSeed
    */
    protected int serverCapabilities;

    /**
     * 字符编码：标识服务器所使用的字符集。
    * @字段说明 serverCharsetIndex
    */
    protected int serverCharsetIndex;

    /**
     * 服务器状态：状态值定义如下（参考MySQL源代码/include/mysql_com.h中的宏定义）：
    * @字段说明 serverStatus
    */
    protected int serverStatus;

    /**
    * @字段说明 restOfScrambleBuff
    */
    protected byte[] restOfScrambleBuff;

    @Override
    public HandshakeBean readPackage(ByteBuffer buffer) {

        // 进行报文内容解析
        MySQLMessage msg = new MySQLMessage(buffer);

        // 1,首先读取长度
        length = msg.readUB3();
        // 2,序列号
        seq = msg.read();
        // 3，服务端版本号
        protocolVersion = msg.read();
        // 4, 服务器版本号
        serverVersion = msg.readBytesWithNull();
        // 5 线程的id
        serverThreadId = msg.readUB4();
        // 6 挑战随机数
        challengeRandom = msg.readBytesWithNull();
        // 7 服务器权能标志
        serverCapabilities = msg.readUB2();
        // 8 字符编码
        serverCharsetIndex = msg.read();
        // 9 服务器状态
        serverStatus = msg.readUB2();
        // 10 其他数据
        msg.move(13);
        restOfScrambleBuff = msg.readBytesWithNull();
        return this;
    }

    public static void main(String[] args) {
        byte[] value = new byte[] { 65, 0, 0, 0, 10, 53, 46, 48, 46, 57, 54, 45, 99, 111, 109, 109, 117, 110, 105, 116,
                121, 45, 110, 116, 0, -84, 0, 0, 0, 83, 56, 92, 73, 55, 116, 104, 43, 0, 44, -94, 33, 2, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 47, 113, 109, 80, 42, 126, 94, 59, 76, 75, 114, 0, };

        ByteBuffer buffer = ByteBuffer.allocate(value.length);

        buffer.put(value);
        buffer.flip();
        HandshakeBean hand = new HandshakeBean();
        HandshakeBean handData = hand.readPackage(buffer);

        AuthPackageBean auth = new AuthPackageBean();

        Map<String, Object> param = new HashMap<>();

        param.put("handShakeBean", handData);

        ByteBuffer ByteValue = auth.getWriteToPackage(param);

    }

    @Override
    public int getpackageSize() {
        return 0;
    }

    @Override
    public ByteBuffer getWriteToPackage(Map<String, Object> param) {
        // TODO Auto-generated method stub
        return null;
    }

}
